package cn.kill.orderservice.controller;

import cn.kill.orderservice.config.AlipayConfig;
import cn.kill.orderservice.pojo.PayOrder;
import cn.kill.orderservice.service.alipay.AliPayService;
import cn.kill.orderservice.service.order.OrderService;
import cn.kill.orderservice.utils.ApiResponse;
import com.alibaba.fastjson.JSONObject;
import com.alipay.api.AlipayApiException;
import com.alipay.api.internal.util.AlipaySignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Date;
import java.util.Iterator;
import java.util.Map;

/**
 * @author 张在成
 */
@Controller
@RequestMapping("/api/alipay")
public class AliPayController {

    @Autowired
    private AliPayService aliPayService;


    @Autowired
    private OrderService orderService;

    /**
     * 获取订单支付链接
     * @param order
     * @return
     */
    @RequestMapping("/nativePay")
    public void  nativePay(HttpServletResponse response, PayOrder order) throws AlipayApiException, IOException {

        String url= AlipayConfig.nativePay(order.getOrderNo(),order.getMoney().toString(),order.getBody());

        response.setContentType("text/html;charset=" + AlipayConfig.CHARSET);
        //直接将完整的表单html输出到页面
        response.getWriter().write(url);
        response.getWriter().flush();
        response.getWriter().close();
    }

    /**
     * 同步调用返回
     * @return
     */
    @GetMapping("/sync")
    @ResponseBody
    public  JSONObject  syncResult(){
        System.out.println("同步调用返回");
        //同步返回一般指的是用户支付完成后返回的页面
        return  ApiResponse.sucessPay("SUCCESS","支付完成，同步返回");
    }


    /**
     * 异步回调通知
     * @param request
     * @param params
     * @return
     * @throws AlipayApiException
     */
    @PostMapping("/async")
    @ResponseBody
    public String  asyncNotifyPayResult(HttpServletRequest request, @RequestParam Map<String,String> params) throws AlipayApiException {

        System.out.println("异步回调...");
        //获取支付宝的通知返回参数，
        //商户订单号
        String out_trade_no = params.get("out_trade_no");
        //支付宝交易号
        String trade_no = params.get("trade_no");
        //交易状态
        String trade_status = params.get("trade_status");

        System.out.println("交易状态："+trade_status+"...订单号："+out_trade_no+"....支付宝交易号："+trade_no);
        //获取支付宝的通知返回参数，可参考技术文档中页面跳转同步通知参数列表(以上仅供参考)//
        //计算得出通知验证结果
        //boolean AlipaySignature.rsaCheckV1(Map<String, String> params, String publicKey, String charset, String sign_type)
        //验签
        boolean verify_result = AlipaySignature.rsaCheckV1(params, AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.CHARSET, "RSA2");

        //验证成功
        if(verify_result){

            //请在这里加上商户的业务逻辑程序代码

            //——请根据您的业务逻辑来编写程序（以下代码仅作参考）——

            if("TRADE_FINISHED".equals(trade_status)){
                //判断该笔订单是否在商户网站中已经做过处理
                //如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
                //请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的
                //如果有做过处理，不执行商户的业务程序

                //注意：
                //如果签约的是可退款协议，退款日期超过可退款期限后（如三个月可退款），支付宝系统发送该交易状态通知
                //如果没有签约可退款协议，那么付款完成后，支付宝系统发送该交易状态通知。
            } else if ("TRADE_SUCCESS".equals(trade_status)){
                //判断该笔订单是否在商户网站中已经做过处理
                //如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
                //请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的
                //如果有做过处理，不执行商户的业务程序

                //注意：
                //如果签约的是可退款协议，那么付款完成后，支付宝系统发送该交易状态通知。

                //订单创建成功之后进行订单状态的修改
                boolean b = orderService.paySucess(out_trade_no, trade_no, new Date());

                if (b){
                    System.out.println("订单状态修改成功");
                }

                System.out.println("异步处理成功......");

            }

        }else{//验证失败

            System.out.println("支付宝验签失败");
        }
        return "success";
    }





}
